package backend.estructuras;

import java.util.List;
import java.util.Random;

import com.dp.client.dto.Fecha;

import backend.Algoritmos.Solver;
import backend.estructuras.common.Almacen;
import backend.estructuras.common.Distribucion;
import backend.estructuras.common.Paquete;


public class DistribucionNormalConexion implements Distribucion {
	double media, varianza;
	Random randomGenerator = new Random(); 
	static int total = 0;
	public DistribucionNormalConexion(double media, double varianza){
		this.media = media;
		this.varianza = varianza;
	}
	public DistribucionNormalConexion(Almacen origen, Almacen destino,
			int media2, double varianza) {
		// TODO Auto-generated constructor stub
	}
	public DistribucionNormalConexion(Almacen a, Almacen b, Fecha fechaLimite,
			Fecha fechaInicioUniverso) {
		// TODO Auto-generated constructor stub
	}
	double mm = 0, vv = 0;
	public DistribucionNormalConexion(Almacen a, Almacen b, Solver solver) {
		List<Paquete> paquetes = a.getPaquetesOriginadosEnAlmacenHacia(b);
		if(paquetes.isEmpty()){
			media = 0; varianza = 0;
		}else{
			Fecha mini = paquetes.get(0).getFechaRegistro(), maxi = paquetes.get(0).getFechaRegistro();
			for(Paquete p : paquetes){
				if(mini.compareTo(p.getFechaRegistro()) > 0) mini = p.getFechaRegistro();
				if(maxi.compareTo(p.getFechaRegistro()) < 0) maxi = p.getFechaRegistro();
			}
			int horas = Math.max(1, Fecha.resta(maxi, mini).toHoras());
			double n = (double)paquetes.size();
			media = n / horas;
			varianza = Math.sqrt(n);
		}
		mm = Math.max(1, media); vv = Math.max(varianza, 0.3);
	}

	public void reset(){
		media = mm; varianza = vv;
		total = 0;
	}
	@Override
	public int getRandom(int diaSemana, int hora) {
		total++;
		if(total == 5000000) return 1;
		double random = randomGenerator.nextGaussian();
		random *= varianza;
		random += media;
		varianza += 0.0000001;
		media += 0.00002;
		return (int)Math.round(Math.max(random, 0.0));
	}

}
